/*将通讯录记录写入文件中*/


#include"contacts.pb.h"
#include<iostream>
#include<fstream>
#include<string>

using namespace std;

const string filename = "contacts.bin";

void AddPersonInfo(contacts::PersonInfo* person){

    cout<<"----------新增联系人----------"<<endl;
    //名字
    string name;
    cout<<"请输入名字:";
    cin>>name;
    person->set_name(name);
    //年龄
    int age;
    cout<<"请输入年龄:";
    cin>>age;
    person->set_age(age);

    //清除多余的\n
    cin.ignore(256,'\n');

    //电话
    for(int i = 0;;++i)
    {
        string str_phone;
        cout<<"输入联系人电话 "<<i+1<< "(输入回车表示完成)"<<endl;
        getline(cin,str_phone);
        if(str_phone.empty())
            break;

        contacts::PersonInfo_Phone* phone = person->add_phone();
        phone->set_number(str_phone);
        //输入电话类型
        int type;
        cout<<"请输入电话类型:(1:移动电话    2:固定电话)";
        cin>>type;
        cin.ignore(256,'\n');
        if(type == 1)
            phone->set_type(contacts::PersonInfo_Phone_PhoneType::PersonInfo_Phone_PhoneType_MB);
        else if(type == 2)
            phone->set_type(contacts::PersonInfo_Phone_PhoneType::PersonInfo_Phone_PhoneType_TEL);
        else
            cout<<"选择有误"<<endl;
    }
    cout<<"---------新增联系人成功---------"<<endl;
}

int main()
{
    /*执行此宏：防止意外连接到与编译的头文件不兼容的库版本，如果
    检测到版本不匹配，程序将终止。
    每一个.pb.cc文件在启动的时候都会自动调用此宏。
    在使用C++ Protobuf之前调用这个宏是好习惯*/
    GOOGLE_PROTOBUF_VERIFY_VERSION;

    contacts::Contacts contacts;
    //读取本地已存在的二进制文件
    //1.打开文件/不存在则创建
    fstream input(filename.c_str(),ios::in | ios::binary); 
    if(!input)/*文件不存在，创建新文件*/{
        cerr<<filename.c_str()<<" Not Found! -> Create new!"<<endl;
    }
    else if(!contacts.ParseFromIstream(&input)){
        cerr<<"Parse Error"<<endl;
        input.close();
        exit(-1);
    }

    //向通讯录添加一个联系人
    AddPersonInfo(contacts.add_contacts());

    //将通讯录内容写入本地文件
    fstream output(filename.c_str(),ios::out | ios::binary | ios::trunc);
    if(!contacts.SerializeToOstream(&output)){//序列化失败，打印错误信息，关闭文件
        cerr<<"Serlalize fail!"<<endl;
        input.close();
        output.close();
        exit(-1);
    }
    cout<<"write Success!"<<endl;
    input.close();
    output.close();

    google::protobuf::ShutdownProtobufLibrary();


    return 0;
}